package com.paping.utils
{
	import flash.display.DisplayObjectContainer;
	import flash.utils.getDefinitionByName;

	/**
	 * Simple Object Pool Class with DisplayObjectContainer
	 * @author 원종선[세계의끝] cuebrick[ at ]gmail.com http://ufx.kr/blog
	 */
	public class ObjectPool
	{
		private var _class:Class;
		private var _activeList:Array = [];
		private var _deactiveList:Array = [];
		private var _container:DisplayObjectContainer;
 
		/**
		 * 할당받을 클래스(형:type)을 지정한다.
		 * @param	$class
		 */
		public function allocation( $class:Class ):void
		{
			_class = $class;
		}
 
		/**
		 * 객체를 부모 컨테이너에 붙여서 반환받고 싶다면 설정한다.
		 * @param	$container
		 */
		public function setContainer( $container:DisplayObjectContainer ):void
		{
			_container = $container;
		}
 
		/**
		 * 이 메서드를 이용해 객체를 요청한다.
		 * _deactiveList 배열을 조회하여 객체가 존재하면 반환하고, 없으면 새로 생성하여 반환해준다.
		 * 새로 생성하여 반환해준 경우 객체를 _activeList 에 push 해 놓는다.
		 * @return
		 */
		public function getInstance():*
		{
			var instance:*;
			if ( _deactiveList.length != 0 )
			{
				instance = getObject();
			}
 			trace("instance  : " + instance);
			if(!instance){
				instance = new _class();
				
				if ( _container )
					_container.addChild( instance );
			}
			_activeList.push( instance );
 
			return instance;
		}
		
		public function getObject():*{
			var instance:*;
			for(var i:int = 0; i < _deactiveList.length; i++){
				if(_deactiveList[i] is _class){
					trace("ccccc");
					instance = _deactiveList[i];
					_deactiveList.splice(i, 1);
					break;
				}
			}
			return instance;
		}
 
		/**
		 * 사용이 끝난 객체를 오브젝트 풀에 반환해준다.
		 * 반환하면 _deactiveList 배열에 등록되고, 다시 사용할 수 있는 상태로 바뀐다.
		 * @param	$instance
		 */
		public function returnInstance( $instance:* ):void
		{
			var instance:*;
			for each ( instance in _activeList )
			{
				if ( instance == $instance )
				{
					//trace( "instance 반환되었음 :", $instance );
					_deactiveList.push( $instance );
					_activeList.splice( _activeList.indexOf( $instance ), 1 );
				}
			}
		}
 
		/**
		 * 현재 사용중인 객체들의 목록을 조회
		 */
		public function get activeList():Array { return _activeList; }
 
		/**
		 * 현재 사용할 수 있는 객체들의 목록을 조회
		 */
		public function get deactiveList():Array { return _deactiveList; }
 
	}

}